òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/13017

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

# ¡Ծۿ£https://www.joinquant.com/post/6596
# ⣺Žֵֶ̡̳
# ߣJoinQuant-TWist

def initialize(context):
    g.stocksnum = 10 # СֵƱ
    g.period = 10 # ֶƵ
    run_daily(daily,time='every_bar')# ѭdaily
    g.days = 1 # ¼Խеڼ죬ʼΪ1

def daily(context):
    # жϲԽǷֶܱƵ1
    if g.days % g.period == 1:

        # ȡǰʱ
        date=context.current_dt.strftime("%Y-%m-%d")
        # ȡָָ֤֤ĳɷֹɴ벢ӣΪȫAгйƱ
        scu = get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')
         # õǷͣϢdataframeͣƵ1δͣƵ0
        suspened_info_df = get_price(list(scu), start_date=context.current_dt, end_date=context.current_dt, frequency='daily', fields='paused')['paused'].T
         # ͣƹƱ dataframe
        unsuspened_index = suspened_info_df.iloc[:,0]<1
         # õδͣƹƱĴlist:
        unsuspened_stocks = suspened_info_df[unsuspened_index].index
        # ѡscuڵĹƱĹƱ룬յǰʱֵС,޳PEΪֵùƱ
        df = get_fundamentals(query(
                valuation.code,valuation.market_cap,valuation.pe_ratio
            ).filter(
                valuation.code.in_(unsuspened_stocks), valuation.pe_ratio>1
            ).order_by(
                valuation.market_cap.asc()
            ), date=date
            )

        # ȡǰg.stocksnumĹƱ룬תlistͣbuylistΪѡеĹƱ
        buylist =list(df['code'][:g.stocksnum])

        # ÿ³еĹƱжϣǷѾbuylist
        for stock in context.portfolio.positions:
            if stock not in buylist: #stockbuylist
                order_target(stock, 0) #stockĳֲΪ0

        # ʽֳg.stocksnum
        position_per_stk = context.portfolio.cash/g.stocksnum
        # position_per_stkСg.stocksnumʽȥbuylistеĹƱ
        for stock in buylist:
            order_value(stock, position_per_stk)
    else:
        pass # ʲôҲ

    g.days = g.days + 1 # Ծ1